<?php

namespace Api;

class Api {

    public static function get($class) {
        $get = $_GET;
        $type = $get['type']??print_r('get:type缺失！') && exit();
        $fn = static::type[$type]??print_r('get:方法不存在！') && exit();
        unset($get['type']);
        $data = app()->make($class)->$fn($get);
        is_array($data) && self::result(...$data); //php 控制器可以用 redis 内存 缓存单例；
    }
    public static function post($class) {
        $post = json_decode(file_get_contents('php://input') , true);
        $type = $post['type']??print_r('post:type缺失！') && exit();
        if (array_key_exists('editForm', $post) || array_key_exists('addForm', $post) || array_key_exists('Form', $post)) {
            $fn = static::type[$type]??print_r('post:方法不存在！') && exit();
            unset($post['type']);
            $data = app()->make($class)->$fn($post);
            is_array($data) && self::result(...$data);
        } else return self::result(-1, '提交错误!');
    }
    /**
     * 统一返回json接口
     * @param int $state
     * @param string $message
     * @param array $data
     * @param int $total
     * @param int $pageSize
     * @return string a JSON encoded string on success or <b>FALSE</b> on failure.
     */
    protected static function result($state = 0, $message = "", $data = [], $total = 0, $pageSize = 0) {
        echo json_encode(['state' => $state, 'message' => $message, 'data' => $data, 'total' => $total, 'pageSize' => $pageSize], JSON_UNESCAPED_UNICODE);
    }
}

//error_reporting(0);
/*也许有经验的PHP程序员最感到痛苦的地方是PHP的解释运行机制。这种运行机制使得每个PHP页面被解释执行后，所有的相关资源都会被回收。也就是说，
PHP在语言级别上没有办法让某个对象常驻内存。在PHP中，所有的变量都是页面级的，无论是全局变量，还是类的静态成员，都会在页面执行完毕后被清空。
以JSP为例，在JSP中，Java Bean的scope有四种有效值：Page、Application、Session、Request,分别对应页面、程序、会话、哀求四种生存期。但在
PHP中，只有Page一种生存期。在PHP中，假如需要在页面之间共享数据，需要手动将变量保存到预定义的全局变量$GLOBALS或$_SESSION中。PHP会将这些
变量保存在某个 文件中，以便下次执行页面时读取。但是，这种方式存在着极大的限制，除了效率的低下外，它还无法保存引用外部资源的变量，例如文件、
Socket、数据库 连接等,而正是这些资源最需要被缓存。这导致了许多高级的模式和技术无法使用。例如,即使是最简朴的Singleton模式也无法在PHP中被
应用。虽然可以使用PHP写出Singleton 的代码，但是由于PHP中没有真正全局的static变量，所以每次页面被执行时，都会重新建立新的对象，这样也就完
全失去了Singleton的意义。 这也导致复杂的OR Mapping技术难以应用，因为没有对象的缓存机制，OR Mapping的开销已经使这种技术失去了意义。*/

class Redis { //门面模式
    public static function __callStatic($method, $args) {
        app()->singleton(\Predis\Predis::class, function () {
            return  new \Predis\Client();
        });//待优化
        return app()->make(\Predis\Predis::class)->$method(...$args);//调用容器app
    }
  }

  class DB {
    public static function __callStatic($method, $args) {
        return app()->make(\Utils\Mapper::class)->$method(...$args);//调用容器app
    }
  }

  class Async { //异步方法
    public static function get($fn, $param = []) {
        $url = PATH.$fn;//运用容器存取字符串
       // $url = PATH.app()->__get('api').'/'.$fn;//运用容器存取字符串
        $host = parse_url($url, PHP_URL_HOST);
        $port = 80;
        $errno = '';
        $errstr = '';
        $timeout = 30;
        $url = $url . '?' . http_build_query($param);
        // create connect
        $fp = fsockopen($host, $port, $errno, $errstr, $timeout);
        if (!$fp) {
            return false;
        }
        // send request
        $out = "GET ${url} HTTP/1.1\r\n";
        $out.= "Host:${host}\r\n";
        $out.= "Connection:close\r\n\r\n";
        fwrite($fp, $out);
        //忽略执行结果；否则等待返回结果
        //if(APP_DEBUG === true){
        // if (false) {
        //     $ret = '';
        //     while (!feof($fp)) {
        //         $ret.= fgets($fp, 128);
        //     }
        // }
        usleep(20000); //fwrite之后马上执行fclose，nginx会直接返回499
        fclose($fp);
    }
  }
